#ifndef AODV_HELLO_H
#define AODV_HELLO_H

#include "aodv_types.h"
#include "aodv_routing_table.h"
#include "aodv_socket.h"

// Hello消息标志
#define HELLO_INTERVAL_MS 1000     // Hello消息发送间隔（毫秒）
#define HELLO_TIMEOUT_MS 3000      // Hello消息超时时间（毫秒）
#define HELLO_LIFETIME_MS 3000     // Hello消息生命周期（毫秒）

/**
 * 构建Hello消息
 * @param hello 指向Hello消息结构的指针
 * @param lifetime Hello消息生命周期（毫秒）
 */
int build_hello_packet(aodv_hello *hello, uint32_t lifetime);

/**
 * 验证Hello消息的有效性
 * @param hello 指向Hello消息结构的指针
 * @param packet_size 接收到的数据包大小
 * @return 1 如果有效，0 如果无效
 */
int validate_hello_message(const aodv_hello *hello, size_t packet_size);

/**
 * 处理接收到的Hello消息
 * @param hello 指向Hello消息结构的指针
 * @param sender_addr 发送者的IP地址
 * @param routing_table 指向路由表的指针
 * @param local_ip 本地节点的IP地址
 */
void process_hello_message(const aodv_hello *hello, uint32_t sender_addr, 
                          aodv_routing_table *routing_table, uint32_t local_ip);

/**
 * 发送Hello消息
 * @param sock 套接字描述符
 * @param local_ip 本地节点的IP地址
 * @param broadcast_addr 广播地址（通常是255.255.255.255）
 */
void send_hello_message(SOCKET sock, uint32_t local_ip, uint32_t broadcast_addr);

/**
 * 检查邻居是否超时
 * @param routing_table 指向路由表的指针
 * @param local_ip 本地节点的IP地址
 * @param current_time 当前时间戳（毫秒）
 */
void check_neighbor_timeout(aodv_routing_table *routing_table, uint32_t local_ip, uint32_t current_time);

/**
 * 启动Hello定时器（非阻塞方式）
 * @param sock 套接字描述符
 * @param local_ip 本地节点的IP地址
 * @param broadcast_addr 广播地址
 * @param routing_table 指向路由表的指针
 */
void start_hello_timer(SOCKET sock, uint32_t local_ip, uint32_t broadcast_addr, aodv_routing_table *routing_table);

/**
 * 停止Hello定时器
 */
void stop_hello_timer(void);

#endif // AODV_HELLO_H